package cn.biplam.back.sql.type;

import java.io.Serializable;

import cn.biplam.common.wrapper.ErrorMessage;

/**
 * VarChar数据元
 * @author 	WangSong
 * @create 	Mar 11, 2009 11:03:13 AM
 * @version 1.0
 */
public class VarChar implements Type,Serializable {

	private static final long serialVersionUID = 534965852606560485L;
	private static final String sTypeName="VARCHAR";
	/**VarChar数据元最大长度*/
	private static final int VARCHAR_MAX_LENGTH=4000;

	private boolean bIsNull=true;
	private int iLength=50;
	private String sValue=null;

	/**
	 * 构造方法 创建一个空值(isNull=true)的VarChar数据元,默认长度=50
	 */
	public VarChar(){}

	/**
	 * 构造方法 创建一个指定长度的空值(isNull=true)的VarChar数据元,默认长度=50
	 * @param length 长度(1<=length<4000)
	 * @throws ErrorMessage 
	 */
	public VarChar(int length) throws ErrorMessage{
		this.setLength(length);
	}

	/**
	 * 构造方法	 创建一个指定长度和内容的VarChar数据元
	 * @param length	长度(1<=length<4000)
	 * @param value		字符串
	 * @throws ErrorMessage 
	 */
	public VarChar(int length,String value) throws ErrorMessage{
		this.setLength(length);
		this.setValue(value);
	}

	/**
	 * 返回数据元的数据类型的完整描述
	 * @return
	 */
	public String getType() {
		StringBuilder sb=new StringBuilder();
		sb.append(sTypeName);
		sb.append("(");
		sb.append(this.iLength);
		sb.append(")");
		return sb.toString();
	}

	/**
	 * 返回数据元数据类型的关键字
	 * @return
	 */
	@SuppressWarnings("static-access")
	public String getTypeName() {
		return this.sTypeName;
	}

	/**
	 * 获得数据元的值，其内容必须经过初始化/设置
	 * @return
	 * @throws ErrorMessage
	 */
	public String getValue() throws ErrorMessage {
		if(this.bIsNull){
			ErrorMessage eMsg=new ErrorMessage("VarChar type is empty!");
			throw eMsg;
		}else{
			return this.sValue;
		}
	}

	/**
	 * 查询数据元内容是否为空
	 * @return
	 */
	public boolean isNull() {
		return bIsNull;	
	}

	/**
	 * 返回数据元的长度
	 * @return
	 */
	public int getPercesion(){
		return iLength;
	}

	/**
	 * 设置数据元的长度(设置并检查VarChar类型长度是否符合规范)
	 * @param length
	 * @throws ErrorMessage
	 */
	public void setLength(int length) throws ErrorMessage {
		ErrorMessage eMsg=null;

		if(iLength>VARCHAR_MAX_LENGTH){
			StringBuilder sb = new StringBuilder();
			sb.append("VarChar type length(");
			sb.append(length);
			sb.append(") is too long!");
			eMsg=new ErrorMessage(sb.toString());
			throw eMsg;
		}else if(iLength<1){
			StringBuilder sb = new StringBuilder();
			sb.append("VarChar type length(");
			sb.append("length");
			sb.append(") error!");
			eMsg=new ErrorMessage(sb.toString());
		}

		if(eMsg==null){
			this.iLength=length;
		}else{
			throw eMsg;
		}		
	}

	/**
	 * 设置数据元的值(不允许传入null)
	 * 			对于VarChar类型，忽略首尾空格
	 * @param sValue 
	 * @throws ErrorMessage
	 */
	public void setValue(String sValue) throws ErrorMessage {
		if(sValue==null){
			ErrorMessage eMsg =new ErrorMessage("The String parameter is null!");
			throw eMsg;
		}else{
			this.sValue=sValue.trim();
			this.bIsNull=false;
		}
	}

	/**
	 * 返回SQL语法表示的数据内容的字符串，如果内容为空，则返回null
	 * @return
	 */
	public String toString() {
		if(this.sValue==null){
			return "null";
		}else{
			StringBuilder sb=new StringBuilder();
			sb.append("'");
			sb.append(this.sValue);
			sb.append("'");
			return sb.toString();
		}
	}

	/**
	 * 返回数据元精度，数据元无精度，默认-1
	 * @return
	 */
	public int getScale() {
		return -1;
	}

}
